package com.itany.shop.service.impl;

import com.itany.shop.dao.ItemDao;
import com.itany.shop.dao.OrderDao;
import com.itany.shop.entity.Item;
import com.itany.shop.entity.Order;
import com.itany.shop.entity.User;
import com.itany.shop.exception.LoginDisabledException;
import com.itany.shop.exception.RequestParameterErrorException;
import com.itany.shop.factory.ObjectFactory;
import com.itany.shop.service.OrderService;
import com.itany.shop.util.ParameterUtil;
import com.itany.shop.vo.Cart;

import java.util.List;

/**
 * @Author:石小俊
 * @Date: 2022/12/21 9:15
 * @Version:1.0-SNAPSHOT
 * @Description:
 */
public class OrderServiceImpl implements OrderService {

    private OrderDao orderDao = (OrderDao) ObjectFactory.getObject("orderDao");
    private ItemDao itemDao = (ItemDao) ObjectFactory.getObject("itemDao");

    @Override
    public String createOrder(Cart cart, User user) throws LoginDisabledException {
        if(null == cart || null == user){
            throw new LoginDisabledException("登录失效,请重新登录");
        }

        // 此时需要保存一条订单与多条明细信息
        // 保存明细时,需要得到保存订单后返回的主键值
        // 因此,必须先保存订单,再对明细进行保存

        // 1.保存订单
        Order order = new Order();
        order.setNo(ParameterUtil.createNo());
        order.setPrice(cart.getPrice());
        order.setUser(user);
        // 保存订单并返回主键id的值
        Integer id = orderDao.insertReturnPrimaryKey(order);
        // 将返回的主键值设置给当前对象order
        order.setId(id);

        // 2.保存明细
        // 取出所有需要保存的明细信息
        List<Item> items = cart.getItems();
        // 遍历这些明细信息
        for(Item item : items){
            // 在购物车中的明细记录中,明细对应的属性除了主键id与order对象属性以外均有对应数据
            // 主键值自动生成
            // order对象表示的是当前明细属于哪一个订单order
            // 此处这些所有的明细均属于当前同步保存的订单
            // 因此,将当前的订单交给对应明细
            item.setOrder(order);
            // 每遍历一条明细,保存一条记录
            itemDao.insertItem(item);
        }
        return order.getNo();
    }

    @Override
    public List<Order> findMyOrders(User user) throws LoginDisabledException {
        if(null == user){
            throw new LoginDisabledException("登录失效,请重新登录");
        }
        List<Order> orders = orderDao.selectByUserId(user.getId());
        return orders;
    }

    @Override
    public Order findDetail(String id) throws RequestParameterErrorException {
        if(ParameterUtil.isNull(id)){
            throw new RequestParameterErrorException("请求参数有误");
        }
        Order order = orderDao.selectDetailById(Integer.parseInt(id));
        return order;
    }
}
